<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  <script>
    //1、 promise 是一个类
    //2、 处理三个状态
    //3、 处理.then 方法

    class Promise{
      // executor 指的是下面 new Promise 内部的回调函数
        constructor(executor) {
          this.state = 'pending' //初始化state状态
          this.value = undefined //记录成功的值
          this.reason = undefined  //记录失败的值

          // 创建成功和失败函数
          let resolve = (value) => {
            // 注意：只有pending状态，才能被改变，所以要进行判断
            if(this.state === 'pending') {
            // console.log('将状态改为成功，并记录成功的信息')
            this.state = 'fulfilled' //更新状态
            this.value = value   //记录成功的信息
            }
          }
          let reject = (reason) => {
            if(this.state === 'pending') {
            // console.log('将状态改为失败，并记录失败的信息')
            this.state = 'rejected' //更新状态
            this.reason = reason //记录失败的信息
            }
          }
          // 将上面2个函数传入
          executor(resolve,reject)
        }

        //这里直接添加then方法
        then(onFullFilled,onRejected) {
            //onFullFilled 如果成功了，被调用
            if(this.state === 'fulfilled') {
              onFullFilled(value)  //将value传入
            }
            //onRejected，如果失败了，被调用
            if(this.state === 'rejected') {
              onRejected(reason)  //将reason传入
            }
        }
    }


      //promiseA+规范：  里面的回调函数称为executor
    const p = new Promise((resolve,reject) => {
    //  resolove 和 reject 是 promise 内部封装好的函数(原理如上)
    // 这里的代码，立刻执行
    // console.log(resolve,reject) //上面executor()的参数传什么就打印什么
      resolve(200)
    })

      //onFullFilled => p成功后，调用的回调
      //onRejected =>   p失败后，调用的回调
      // p.then(onFullFilled,onRejected).catch(处理函数)
    p.then((res) => {
      console.log(res)
    },(err) => {
      console.log(err)
    })
    




  </script>
</body>
</html>